<?php
class Main_Form extends Zend_Form
{
	/**
     * Перевод валидаторов
     * @var array
     */
    static protected $_translate_array = array(
        //Zend_Validate_EmailAddress::INVALID     => 'Неверный формат',
        Zend_Validate_EmailAddress::INVALID             => '"%value%" не соответствует адресу электронной почты (формат: имя@домен)',
        Zend_Validate_EmailAddress::INVALID_HOSTNAME    => '"%hostname%" неверный домен для адреса "%value%"',
        Zend_Validate_EmailAddress::INVALID_MX_RECORD   => 'Домен "%hostname%" не имеет MX-записи об адресе "%value%"',
        Zend_Validate_EmailAddress::DOT_ATOM            => '"%localPart%" не соответствует формату dot-atom',
        Zend_Validate_EmailAddress::QUOTED_STRING       => '"%localPart%" не соответствует формату указанной строки',
        Zend_Validate_EmailAddress::INVALID_LOCAL_PART  => '"%localPart%" не правильное имя для адреса "%value%", вводите адрес вида имя@домен',

        Zend_Validate_Hostname::IP_ADDRESS_NOT_ALLOWED  => '"%value%" - это IP-адрес, но IP-адреса не разрешены ',
        Zend_Validate_Hostname::UNKNOWN_TLD             => '"%value%" - это DNS имя хоста, но оно не дожно быть из TLD-списка',
        Zend_Validate_Hostname::INVALID_DASH            => '"%value%" - это DNS имя хоста, но знак "-" находится в неправильном месте',
        Zend_Validate_Hostname::INVALID_HOSTNAME_SCHEMA => '"%value%" - это DNS имя хоста, но оно не соответствует TLD для TLD "%tld%"',
        Zend_Validate_Hostname::UNDECIPHERABLE_TLD      => '"%value%" - это DNS имя хоста. Не удаётся извлечь TLD часть',
        Zend_Validate_Hostname::INVALID_HOSTNAME        => '"%value%" - не соответствует ожидаемой структуре для DNS имени хоста',
        Zend_Validate_Hostname::INVALID_LOCAL_NAME      => '"%value%" - адрес является недопустимым локальным сетевым адресом',
        Zend_Validate_Hostname::LOCAL_NAME_NOT_ALLOWED  => '"%value%" - адрес является сетевым расположением, но локальные сетевые адреса не разрешены',

        Zend_Validate_NotEmpty::IS_EMPTY        => 'Это поле не должно быть пустым',

        Zend_Validate_StringLength::TOO_LONG    => 'Максимум %max% символов',
        Zend_Validate_StringLength::TOO_SHORT   => 'Минимум %min% символов',

        Zend_Captcha_Word::BAD_CAPTCHA          => 'Символы проверки не совпали',
        Zend_Captcha_Word::MISSING_VALUE        => 'Не введены символы проверки',
        Zend_Captcha_Word::MISSING_ID           => 'ID символов проверки устарел',
        Zend_Validate_Digits::NOT_DIGITS => 'Значение "%value%" неправильное. Введите только цифры',

        Zend_Validate_Date::INVALID_DATE    => "'%value%' - недопустимая дата",
        Zend_Validate_Date::FALSEFORMAT     => "'%value%' - не правильный формат даты, дата должна быть вида 'дд.мм.гггг'",

        Zend_Validate_Float::NOT_FLOAT => "'%value%' - не является числом",
    );
    
    /**
     * @var Array
     */
    protected $_decoratorsForm;
    
    /**
     * @var array
     */
    protected $_decoratorsElementTable = array(
    	'ViewHelper',
        'Description',
        'Errors',
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class'  => 'element')),
        array('Label', array('tag' => 'td', 'class' => 'label', 'escape'=>false)),
        array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
    );
    
    protected $_decoratorsFormTable  = array(
        'FormElements',
        array('HtmlTag', array('tag' => 'table', 'class' => 'table-form')),
        'Form',
    );
    
    /**
     * @var array
     */
    protected $_decoratorsButtonTable = array(
    	'ViewHelper',
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class'  => 'button', 'colspan' => 2)),
        array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
    );
    
    /**
     * @var array
     */
    protected $_decoratorsHidden = array(
    	'ViewHelper'
    );

    /**
     * Кэш
     * @var array
     */
    static protected $_cash = array ();
    
    /**
     * @var array
     */
    protected static $_loadedClasses;
    
    /**
     * (non-PHPdoc)
     * @see library/Zend/Zend_Form#init()
     */
    public function init()
    {
    	parent::init();
    	
    	$this->addElementPrefixPath('Main_Validate', 'Main/Validate/', 'validate');
    	
        //if (empty(self::$_cash['translited'])) {
        	//debug(self::$_translate_array); exit;
        	//$translator = new Zend_Translate_Adapter_Array(self::$_translate_array);
        	//Zend_Form::setDefaultTranslator($translator);
			//Zend_Validate_Abstract::setDefaultTranslator($translator);
           // Zend_Form::setDefaultTranslator(new Zend_Translate_Adapter_Array(self::$_translate_array));
            //self::$_cash['translited'] = true;
        //}
    	
    }

    /**
     * @param string $name
     * @return array
     */
    public static function factory($name) 
    {
    	if (!empty(self::$_loadedClasses[$name])) {
            return self::$_loadedClasses[$name];
        } else {
			$className = Main_Const::APP_NAMESPACE . $name;
			if (! class_exists($className)) {
				throw new Exception("Класс $className не существует");
			} else {
				return self::$_loadedClasses[$name] = new $className();
			}  
        }	
    }
    
    /**
     * @return array
     */
    public function getFieldList()
    {
        return array_keys($this->getElements());
    }
    
    /**
     * @param array $data
     * @return Main_Form
     */
    public function setFormValues($data)
    {
        foreach ($this->getFieldList() as $field) {
            if (isset($data[$field])) {
                if (is_string($data[$field])) {
                    $data[$field] = htmlspecialchars_decode($data[$field]);
                }
                $this->getElement($field)->setValue($data[$field]);
            }
        }
        return $this;
    }
    
    /**
     * @param string $elementName
     * @param string $decoratorName
     * @return Zend_Form_Element|bool
     */
    public function setDecoratorsForElement($elementName, $decoratorName)
    {
    	$element = $this->getElement($elementName);
    	if (!empty($element) && (!empty($this->{$decoratorName}))) {
    		$element->setDecorators($this->{$decoratorName});
    		return $element;
    	}
        return false;
    }

}
